home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Multimedia Toolkit
/
Multimedia Toolkit.iso
/
pascal
/
biosvide.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-03-10
|
9KB
|
404 lines
{****************************************************************************}
{ }
{ MODULE: BiosVideo }
{ }
{ DESCRIPTION: Provides access to all the BIOS video services. }
{ }
{ AUTHOR: Juan Carlos Arévalo }
{ }
{ MODIFICATIONS: Nobody (yet ;-) }
{ }
{ HISTORY: 19-Dec-1992 Creation. }
{ }
{ (C) 1992 VangeliSTeam }
{____________________________________________________________________________}
UNIT BiosVideo;
INTERFACE
TYPE
TVideoStateSaved =
RECORD
Mode : BYTE;
FontSize : BYTE;
Buffer : POINTER;
END;
PROCEDURE SaveVideoState (VAR Buffer: TVideoStateSaved);
PROCEDURE RestoreVideoState (VAR Buffer: TVideoStateSaved);
PROCEDURE SetVideoMode (Mode: BYTE);
FUNCTION GetVideoMode : BYTE;
PROCEDURE ForceEGAMode;
PROCEDURE SelectFont8x8 (Font: BYTE);
PROCEDURE SelectFont8x14 (Font: BYTE);
PROCEDURE SelectFont8x16 (Font: BYTE);
PROCEDURE SelectFontQuiet8x8 (Font: BYTE);
PROCEDURE SelectFontQuiet8x14 (Font: BYTE);
PROCEDURE SelectFontQuiet8x16 (Font: BYTE);
PROCEDURE FillFont (Font: BYTE; First: CHAR; NChars: WORD;
Size: BYTE; Data: POINTER);
PROCEDURE SelectFonts (FontDim, FontBright: BYTE);
PROCEDURE NoCursor;
PROCEDURE UnderCursor;
PROCEDURE BlockCursor;
PROCEDURE SetCursor (x, y: BYTE; Page: BYTE);
PROCEDURE BlinkOff;
PROCEDURE SetPalette (Palette: POINTER);
PROCEDURE SetVideoPage (Page: BYTE);
PROCEDURE FillVideoMemory (Chr: CHAR; Attr: BYTE);
IMPLEMENTATION
{----------------------------------------------------------------------------}
{ Video mode services. }
{____________________________________________________________________________}
PROCEDURE SaveVideoState(VAR Buffer: TVideoStateSaved);
VAR
FSize : WORD ABSOLUTE 0:$485;
BEGIN
Buffer.FontSize := FSize;
Buffer.Mode := GetVideoMode;
ASM
MOV CX,$07
LES BX,[Buffer]
LES BX,TVideoStateSaved([ES:BX]).Buffer
MOV AX,$1C01
INT $10
END;
END;
PROCEDURE RestoreVideoState(VAR Buffer: TVideoStateSaved);
BEGIN
SetVideoMode(Buffer.Mode);
CASE Buffer.FontSize OF
8 : SelectFont8x8(0);
14 : SelectFont8x14(0);
16 : SelectFont8x16(0);
ELSE
SelectFont8x16(0);
END;
ASM
MOV CX,$07
LES BX,[Buffer]
LES BX,TVideoStateSaved([ES:BX]).Buffer
MOV AX,$1C02
INT $10
END;
END;
PROCEDURE SetVideoMode(Mode: BYTE); ASSEMBLER;
ASM
MOV AL,Mode
XOR AH,AH
INT $10
END;
FUNCTION GetVideoMode : BYTE; ASSEMBLER;
ASM
MOV AH,$F
INT $10
AND AL,$7F
END;
PROCEDURE ForceEGAMode; ASSEMBLER;
ASM
MOV BL,$30 { en vez de 9x8, que no sirve para hacer gráficos bien. }
MOV AX,$1201 { 350 líneas (EGA) para que los caracteres tengan 8X8 }
INT $10
END;
{----------------------------------------------------------------------------}
{ Font services. }
{____________________________________________________________________________}
PROCEDURE SelectFont8x8(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1112
INT $10
END;
PROCEDURE SelectFont8x14(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1111
INT $10
END;
PROCEDURE SelectFont8x16(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1114
INT $10
END;
PROCEDURE SelectFontQuiet8x8(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1102
INT $10
END;
PROCEDURE SelectFontQuiet8x14(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1101
INT $10
END;
PROCEDURE SelectFontQuiet8x16(Font: BYTE); ASSEMBLER;
ASM
MOV BL,Font
MOV AX,$1104
INT $10
END;
PROCEDURE FillFont(Font: BYTE; First: CHAR; NChars: WORD;
Size: BYTE; Data: POINTER); ASSEMBLER;
ASM
PUSH BP { Rellena el segundo font }
MOV BL,Font
MOV BH,Size
MOV CX,NChars
MOV DL,First
XOR DH,DH
LES BP,Data
MOV AX,$1110
INT $10
POP BP
END;
PROCEDURE SelectFonts(FontDim, FontBright: BYTE); ASSEMBLER;
ASM
MOV AL,FontDim
MOV BL,AL
AND AL,100b
SHL AL,2
AND BL,11b
OR BL,AL
MOV AL,FontBright
MOV AH,AL
AND AL,100b
SHL AL,3
OR BL,AL
AND AH,11b
SHL AH,2
OR BL,AH
MOV AX,$1103 { Activa los dos fonts }
INT $10
END;
{----------------------------------------------------------------------------}
{ Text cursor services. }
{____________________________________________________________________________}
PROCEDURE NoCursor; ASSEMBLER;
ASM
MOV CX,$700
MOV AH,1
INT $10
END;
PROCEDURE UnderCursor; ASSEMBLER;
ASM
MOV CX,$607
MOV AH,1
INT $10
END;
PROCEDURE BlockCursor; ASSEMBLER;
ASM
MOV CX,$007
MOV AH,1
INT $10
END;
PROCEDURE SetCursor(x, y: BYTE; Page: BYTE); ASSEMBLER;
ASM
MOV DH,y
MOV DL,x
MOV BH,Page
MOV AH,2
INT $10
END;
{----------------------------------------------------------------------------}
{ Attribute services. }
{____________________________________________________________________________}
PROCEDURE BlinkOff; ASSEMBLER;
ASM
XOR AX,AX
MOV ES,AX
MOV AL,[ES:$465]
AND AL,11011111b
MOV DX,$3D8
OUT DX,AL
(*
MOV AX,$1003 { Quita parpadeo }
MOV BH,1
INT $10
*)
END;
PROCEDURE SetPalette(Palette: POINTER); ASSEMBLER;
ASM
LES DX,Palette
MOV AX,$1002
INT $10
END;
{----------------------------------------------------------------------------}
{ Miscellaneous services. }
{____________________________________________________________________________}
PROCEDURE SetVideoPage(Page: BYTE); ASSEMBLER;
ASM
MOV AL,Page
MOV AH,$05
INT $10
END;
{----------------------------------------------------------------------------}
{ Miscellaneous routines. }
{____________________________________________________________________________}
PROCEDURE FillVideoMemory(Chr: CHAR; Attr: BYTE); ASSEMBLER;
ASM
CLD
MOV DI,0
MOV AX,$B800
MOV ES,AX
MOV CX,$4000
MOV AH,Attr
MOV AL,Chr
REP STOSW
END;
END.